/*******************************************************************************
* Copyright (c) 2015 IBH SYSTEMS GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBH SYSTEMS GmbH - initial API and implementation
*******************************************************************************/
package org.eclipse.packagedrone.web.dispatcher.internal;
import java.io.IOException;
import java.util.Dictionary;
import java.util.Hashtable;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.packagedrone.web.DispatcherServlet;
import org.eclipse.packagedrone.web.dispatcher.Dispatcher;
import org.eclipse.packagedrone.web.dispatcher.DispatcherHttpContext;
import org.eclipse.packagedrone.web.dispatcher.JspServletInitializer;
import org.eclipse.packagedrone.web.dispatcher.internal.internal.jsp.JspBundle;
import org.eclipse.packagedrone.web.dispatcher.internal.internal.jsp.JspBundleCustomizer;
import org.ops4j.pax.web.service.WebContainer;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.service.http.NamespaceException;
import org.osgi.util.tracker.BundleTracker;
public class DispatcherServletInitializer
{
public static class BundleFilter implements Filter
{
@Override
public void destroy ()
{
}
@Override
public void doFilter ( final ServletRequest request, final ServletResponse response, final FilterChain chain ) throws IOException, ServletException
{
if ( response instanceof HttpServletResponse )
{
( (HttpServletResponse)response ).setStatus ( HttpServletResponse.SC_NOT_FOUND );
response.setContentType ( "text/plain" );
response.getWriter ().write ( "Resource not found" );
}
}
@Override
public void init ( final FilterConfig arg0 ) throws ServletException
{
}
}
private WebContainer webContainer;
private BundleTracker<JspBundle> jspTracker;
private FilterTracker proxyFilter;
private DispatcherHttpContext context;
public void setWebContainer ( final WebContainer webContainer )
{
this.webContainer = webContainer;
}
private static final String PROP_PREFIX = "osgi.web.dispatcher";
private static final String PROP_PREFIX_MP = PROP_PREFIX + ".multipart";
public void start () throws ServletException, NamespaceException
{
final BundleContext bundleContext = FrameworkUtil.getBundle ( DispatcherServletInitializer.class ).getBundleContext ();
this.context = Dispatcher.createContext ( bundleContext );
Dictionary<String, String> initparams = new Hashtable<> ();
final MultipartConfigElement multipart = JspServletInitializer.createMultiPartConfiguration ( PROP_PREFIX_MP );
this.webContainer.registerServlet ( new DispatcherServlet (), "dispatcher", new String[] { "/" }, initparams, 1, false, multipart, this.context );
this.proxyFilter = new FilterTracker ( bundleContext );
this.webContainer.registerFilter ( this.proxyFilter, new String[] { "/*" }, null, null, this.context );
initparams = new Hashtable<> ();
initparams.put ( "filter-mapping-dispatcher", "request" );
this.webContainer.registerFilter ( new BundleFilter (), new String[] { "/bundle/*" }, null, initparams, this.context );
this.jspTracker = new BundleTracker<> ( bundleContext, Bundle.INSTALLED | Bundle.ACTIVE, new JspBundleCustomizer ( this.webContainer, this.context ) );
this.jspTracker.open ();
}
public void stop ()
{
this.context.dispose ();
this.jspTracker.close ();
this.webContainer.unregister ( "/" );
}
}